// 对象编程

// 对象的创建
let obj1 = new Object();  // 构造函数

let obj2 = {}; // 对象字面量

// Map,<属性名：属性值>的集合，属性名通常是string，属性值可以是任意类型，包括object
let user = {
  name: "张三",
  age: 20
}

// 设置属性
user.role = "student"

// 删除属性
delete user.role

console.log(user);
console.log(user.name);

// [] 访问符
user["is admin"] = true  // 使用环境：不符合标识符命名规则
let a = "age"
console.log(user[a]);

// for...in 遍历对象的属性名
for(let key in user) {
  // console.log(key + ":" + user[key]);
  console.log(`${key}:${user[key]}`);
  
}

console.log(typeof user); // object,user只是一个引用ref， 不是对象本身
let user2 = user;
user.age = 21
console.log(user2.age); // 21, user 和 user2 指向同一个对象

// 可选链 ?.
// console.log(user.features.role);  //报错：Cannot read properties of undefined (reading 'role')
console.log(user.features?.role);  // undefined


// 浅层克隆对象
// let user3 = {}
// for(let key in user) {
//   user3[key] = user[key]
// }
user.features = {
  role: "student",
  gender: "male"
}
let user3 = Object.assign({}, user)
console.log(user3.age);
user.features.gender = "female"
console.log(user3.features); // {role: "student", gender: "female"}


